package com.itheima.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.itheima.common.BaseContext;
import com.itheima.common.R;
import com.itheima.pojo.AddressBook;
import com.itheima.service.AddressBookService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Slf4j
@RestController
@RequestMapping("/addressBook")
public class AddressBookController {

    // 地址薄需要实现的功能:
    //  -> 新增地址 -> 地址列表查询 -> 设置默认地址 -> 编辑地址 -> 删除地址

    @Autowired
    private AddressBookService addressBookService;

    // 新增地址 : -> 关联当前的用户,对用户的地址进行记录
    @PostMapping
    public R<AddressBook> save(@RequestBody AddressBook addressBook){
        //1 获取当前登录用户的id
        Long currentId = BaseContext.getCurrentId();
        //2 关联当前用户
        addressBook.setUserId(currentId);

        log.info("addressBook: {}",addressBook);

        //3 调用方法新增地址
        addressBookService.save(addressBook);

        //4 返回结果
        return R.success(addressBook);
    }

    // 设置默认地址 : -> 用户地址可以有多个,但默认地址只有一个
    //                  -> 首先将当前用户所有地址的"is_default"更新为0
    //                      -> 再将将当前设置的默认地址的"is_default"设置为1
    @PutMapping("default")
    public R<AddressBook> setDefault(@RequestBody AddressBook addressBook){
        log.info("addressBook: {}",addressBook);

        //1 创建条件构造器
        LambdaUpdateWrapper<AddressBook> updateWrapper = new LambdaUpdateWrapper<>();

        //2 添加查询条件
        updateWrapper.eq(AddressBook::getUserId,BaseContext.getCurrentId());
        // -> 将当前用户所有地址的"is_default"更新为0
        updateWrapper.set(AddressBook::getIsDefault,0);
        // 调用方法进行更新
        addressBookService.update(updateWrapper);
        // -> 将当前设置的默认地址的"is_default"设置为1
        addressBook.setIsDefault(1);

        addressBookService.updateById(addressBook);
        // 返回结果
        return R.success(addressBook);
    }

    // 根据Id查询用户地址
    @GetMapping("/{id}")
    public R getById(@PathVariable Long id){
        //11 调用方法进行查询
        AddressBook byId = addressBookService.getById(id);

        //2 对当前用户id进行判定
        if (byId != null){
            // 用户id存在
            return R.success(byId);
        }else {
            // 用户id不存在
            return R.error("对象不存在");
        }
    }


    // 查询默认地址 : -> 根据当前用户登录Id及is_default进行查询
    //                  -> 查询当前登录用户is_default为1的地址信息
    @GetMapping("default")
    public R<AddressBook> getDefault(){
        //1 创建条件构造器
        LambdaQueryWrapper<AddressBook> queryWrapper = new LambdaQueryWrapper<>();

        //2 添加查询条件进行查询
        queryWrapper.eq(AddressBook::getUserId,BaseContext.getCurrentId())
                .eq(AddressBook::getIsDefault,1);

        //3 调用方法进行查询
        AddressBook one = addressBookService.getOne(queryWrapper);

        //4 对查询结果进行判断
        if (one != null){
            return R.success(one);
        } else {
            return R.error("未找到对象");
        }
    }

    // 查询指定用户的全部地址 : -> 根据当前登录用户的id,查询所有的地址信息
    @GetMapping("/list")
    public R<List<AddressBook>> list(AddressBook addressBook){
        //1 关联当前用户id
        addressBook.setUserId(BaseContext.getCurrentId());
        log.info("addressBook: {}",addressBook);

        //2 创建条件构造器
        LambdaQueryWrapper<AddressBook> queryWrapper = new LambdaQueryWrapper<>();

        //3 添加查询条件  条件: 关联的用户id不能为空
        queryWrapper.eq(addressBook.getUserId() != null, AddressBook::getUserId,addressBook.getUserId());

        //4 添加排序条件  条件: 按照修改时间进行升序排序
        queryWrapper.orderByDesc(AddressBook::getUpdateTime);

        //5 调用方法完成查询
        List<AddressBook> list = addressBookService.list(queryWrapper);

        //6 返回查询结果
        return R.success(list);
    }
    // 删除地址(可能是多个)
    @DeleteMapping
    public R<String> delete(Long ids){
        log.info("ids:{}",ids);
        addressBookService.removeById(ids);
        return R.success("删除成功");
    }

    // 修改地址
    @PutMapping
    public R<AddressBook> update(@RequestBody AddressBook addressBook){
        log.info("addressBook:{}",addressBook);
        addressBookService.updateById(addressBook);
        return R.success(addressBook);
    }
}
